interface Person {
  name: string;
  age: number;
  gender: string;
}

// 类型约束可以强制规定为一个特定的字符串
type NAME = "name";
// 此时 NAME 类型约束的变量只能为 'name' 字符串，赋值为其他值会报错
const abc: NAME = "name";

// 当 T extends keyof Person 泛型遍历时
// 第一次遍历
// type T = 'name'; 注意，这里 T 是键名
// key: 'name';
// Person['name'];

// 第二次遍历
// type T = 'age'; 注意，这里 T 是键名
// key: 'age';
// Person['age'];

// 第三次遍历
// type T = 'gender'; 注意，这里 T 是键名
// key: 'gender';
// Person['gender'];

class Teacher {
  // 接收一个 Person 接口类型的数据存到 info 变量中去
  constructor(private info: Person) {}
  getInfo<T extends keyof Person>(key: T): Person[T] {
    return this.info[key];
  }
}

const teacher = new Teacher({
  name: "dell",
  age: 18,
  gender: "male",
});

const test = teacher.getInfo("name");
console.log(test);
